4.4 ブロックフロート化
行列ベクトル積和演算は、積の入力がどちらもブロックフロート化されている必要がある。そのため、まず
はブロックフロート形式およびブロックフロート化命令の詳細を述べる。
ブロックフロート形式は、精度ごとに決まった要素数の中で指数部をあらかじめ揃えておくことで、積和演
算時の指数差によるシフトを省略するための中間的な形式である。ブロックフロート形式の各精度について、
ブロックサイズと変換元の浮動小数点数の精度を表4.1に示す。
code:txt
表4.1 ブロックフロート形式のブロックサイズと変換元の浮動小数点数の精度
精度 ブロックサイズ 変換前の浮動小数点数の精度
半精度 16 半精度
疑似単精度 8 単精度
単精度 4 単精度
倍精度 4 倍精度
ブロックの中で指数部の値が一致していないならば、後述の半精度の拡張表現における例外を除き、不正な
ブロックフロート値となる。この一致した指数部の値を以降共通指数と呼ぶ。不正なブロックフロート値を行
列積和演算の積の入力にした場合の動作は未定義である。
有効なブロックフロート値の解釈は、けち表現を用いないことを除き、変換前の通常の浮動小数点数値と同
じである。これは指数部長や仮数部長も含む。例えば、符号が 0 、バイアスを除いた指数部が 0 で、仮数部は
MSBだけが 1 で残りは 0 のとき、 1. 0 を表す。また、仮数部を全ビット 0 にすることで 0. 0 が表現できるこ
とも分かる。ただし、疑似単精度ブロックフロート値の解釈においては仮数部のLSB側 5 ビットは無視され
て 0 とみなされる。
半精度ブロックフロート形式には、通常の浮動小数点数の非正規化数のような拡張表現がある。拡張表現で
は、指数部が共通指数ではなく全ビット 0 である値を許す。そのような値は指数が共通指数から− 6 されてい
るものとみなす。たとえばブロックの共通指数が0x1f(バイアスを引くと0)のとき、符号が 0 、指数部が全
ビット 0 、仮数部が 1 の半精度ブロックフロート値は 2 −^14 を表す。拡張表現の目的は、ブロックフロート値
への変換時のアンダーフローの抑制である。拡張表現は疑似単精度・単精度・倍精度ではサポートされない。
拡張表現なしの半精度ブロックフロート形式は、拡張表現ありの場合に完全に含まれておりその解釈も同じ
であるから、行列ベクトル積和演算時に拡張表現の有無に応じたモードの切り替えは必要ない。
以下ではブロックフロート化命令の具体的な手順を示す。ブロックサイズをnとする。
疑似単精度・単精度・倍精度のブロックフロート化は以下の手順で行う。
1.n個の入力の最大の指数と、その最大の指数を持つ要素を判別する
2.最大の指数を持つ要素に、仮数部のビットがすべて 1 であるものがある場合、最大の指数に 1 を足した
ものを共通指数とする。これは最近接偶数丸めの繰り上がりによるものである
3.無限大と 0 に関わる例外処理を行う
(a)共通指数が無限大を表す値以上であれば、出力すべてについて、符号は入力そのまま、指数部は無
限大とし、仮数部は全ビット 0 とする
(b)共通指数に関わらず、指数部が全ビット 0 の入力に対する出力は、符号は入力そのまま、指数部は
共通指数、仮数部は全ビット 0 とする
(c)入力すべての指数部が全ビット 0 である場合、出力すべてについて、符号は入力そのまま、指数部
は全ビット 0 、仮数部は全ビット 0 とする
4.共通指数と各要素の指数の差を計算する
5.各要素の仮数部にhidden bitを補い、指数差だけダウンシフトを行い、最近接偶数丸めを行う。変換
後は必ず仮数部長が短くなるので、丸めが常に行われる。また、指数差が 0 のとき、補われたhidden
bitが仮数部のMSBに入るように位を揃えるものとする。またこの際疑似単精度では、フォーマット
としての仮数部 23 ビットのうちMSB側 18 ビットを使うものとする。残りの 5 ビットは 0 になる
6.仮数部がアンダーフローしない(丸めた結果が全ビット 0 でない)要素の出力は、符号は入力そのまま、
指数部は共通指数、仮数部は丸めた結果とする
7.仮数部がアンダーフローする要素の出力は、符号は入力そのまま、指数部は共通指数、仮数部は全ビッ
ト 0 とする
次に半精度ブロックフロート値への変換について述べる。第3.6.12.11節で述べた通り、半精度のブロック
フロート化では拡張表現の有無に関わらず、変換後の仮数部長を 6 から 9 で指定できる。 9 から変換後の仮数
部長を引いた値、すなわち仮数部が短くなる量をbと置く。
拡張表現なしの半精度ブロックフロート化は以下の手順で行う。
1.n個の入力の最大の指数と、その最大の指数を持つ要素を判別する
2.最大の指数を持つ要素に、仮数部からLSB側bビットを除いたもののビットがすべて 1 であるものが
ある場合、最大の指数に 1 を足したものを改めて最大の指数とする。これは最近接偶数丸めの繰り上が
りによるものである
3.最大の指数にbを加算したものを共通指数とする
4.疑似単精度・単精度・倍精度の場合と同じ、無限大と 0 に関わる例外処理を行う。以降も同じである
code:txt
拡張表現ありの半精度ブロックフロート化は以下の手順で行う。
1.共通指数の算出及び無限大と 0 に関わる例外処理までは、拡張表現なしの場合と同じである
2.共通指数と各要素の指数の差を計算する
3.各要素について、指数差が6 +b以上のとき、専用のフラグを立てる。ただし、指数差が6 +bで、か
つ仮数部のLSB側bビットを除いたものがすべて 1 の場合はこのフラグを立てない
4.フラグの立っていない要素に関しては、仮数部にhidden bitを補い、指数差だけダウンシフトを行い、
最近接偶数丸めを行う
5.フラグの立っている要素に関しては、仮数部にhidden bitを補い、指数差から 6 を引いた幅だけダウ
ンシフトを行い、最近接偶数丸めを行う
6.仮数部がアンダーフローしない要素の出力は、符号は入力そのまま、仮数部は丸めた結果とする。指数
部はフラグが立っていない場合は共通指数、立っている場合は全ビット 0 とする
7.仮数部がアンダーフローする要素の出力は、符号は入力そのまま、指数部と仮数部は全ビット 0 とする